package com.etalk.crm.dao;

import com.etalk.crm.pojo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author Jordan
 */
@Mapper
public interface StudentReportCustomizeMapper {

    /**
     * 生成学习报表数据
     * @param record 报表数据
     * @return 记录数
     */
    int insertBatchReportList(StudentReportCustomize record);

    /**
     * 添加学习报表中教课信息
     * @param record 数据
     * @return
     */
    int insertDetail(StudentReportCustomizeDetail record);

    /**
     * 添加学习表报中近期重点学习内容
     * @param reportId 报表id
     * @param list 知识点内容
     * @return 记录数
     */
    int insertCustomizeDetailKnowledge(@Param("reportId") int reportId, @Param("list") List<ReportSubmitParam> list);

    /**
     * 查询月报表部分信息：月完成课数，月应上课数，被点名次数
     * @param personId 学员id
     * @param startTime 学习报表开始时间
     * @param endTime 学习报表结束时间
     * @return 结果
     */
    StudentReportCustomize selectPersonAndClassHourInfoByCustomize(@Param("personId") int personId,@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询月报中错题本中出现的语法、词汇、发音出现的次数
     * @param personId 学员id
     * @param startTime 学习报表开始时间
     * @param endTime 学习报表结束时间
     * @return 结果
     */
    StudentReportCustomize selectWrongQuestionInfoByCustomize(@Param("personId") int personId,@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询月报表上课最多的常用老师名称和图像，没有常用老师的不管
     * @param personId 学员id
     * @param startTime 学习报表开始时间
     * @param endTime 学习报表结束时间
     * @return 结果
     */
    StudentReportCustomize selectCommonTeacherInfoByCustomize(@Param("personId") int personId,@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询用户订单所有有效订单的剩余课时之和
     * @param personId 学员id
     * @param startTime 学习报表开始时间
     * @param endTime 学习报表结束时间
     * @return 结果
     */
    StudentReportCustomize selectOrderRemainHoursByCustomize(@Param("personId") int personId,@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询最近两节中教课程id和上课时间
     * @param personId
     * @return
     */
    List<Map<String,Object>> selectLtClassTimeByPersonId(@Param("personId") int personId);


    /**
     * 查询两节中教课之间课程完成情况
     * @param personId 学员id
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    StudentReportCustomizeDetail selectClassPerformanceByPersonId(@Param("personId") int personId,@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询两节中教课之间课程旷课和被点名次数
     * @param personId 学员id
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    StudentReportCustomizeDetail selectLateComplaintNumByPersonId(@Param("personId") int personId,@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询中教课程id
     * @param personId 学员id
     * @param startTime 课程开始时间
     * @param endTime 课程结束时间
     * @return 课程id，状态status(1：知识点，0：错词本)
     */
    List<Integer> selectLtLessonIdByPersonId(@Param("personId") int personId,@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询课程的知识点
     * @param listLessonId 课程id列表
     * @return 已上的知识点
     */
//    List<TextbookKnowledgePoint> selectLessonKnowledgePointList(@Param("listLessonId") List<Integer> listLessonId);

    /**
     * 查询错词本，每次取一节课的错词
     * @param listLessonId 课程id列表
     * @return
     */
//    List<MistakeBook> selectMistakeListByPersonId(@Param("listLessonId") List<Integer> listLessonId);

    /**
     * 查询中教课程错词本
     * @param lessonId 课程id
     * @return 中教错词本
     */
    List<MistakeKnowledge> selectLtMistakeBookListByLessonId(@Param("lessonId") int lessonId);

    /**
     * 查询课程已掌握错词本或知识点
     * @param listLessonId 课程id列表
     * @return
     */
    List<MistakeKnowledge> selectMistakeKnowledgeListByLessonId(@Param("listLessonId") List<Integer> listLessonId);

    /**
     * 查询老师投诉学员标签次数
     * @param personId 学员id
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    List<String> selectTeacherComplaintByPersonId(@Param("personId") int personId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询英语知识点类别
     * @param parentId 父id
     * @return 类别
     */
    List<KnowledgePointClassification> selectKnowledgePointClassificationListByParentId(@Param("parentId") Integer parentId);

    /**
     * 查询学习建议年级分类
     * @return
     */
    List<Map<String,Object>> selectStudySuggestionsGrade();

    /**
     * 查询最后一节中教课评价中的学习建议
     * @param lessonId
     * @return
     */
    String selectLtStudySuggestions(@Param("lessonId") int lessonId);

    /**
     * 根据学习建议年级id查询知识点分类
     * @return
     */
    List<Map<String,Object>> selectStudySuggestionsKnowledgeByGradeId();

    /**
     * 查询学员测试成绩
     * @param personId 学员id
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return
     */
    List<StudentReportCustomize> selectTestScoresByPersonId(@Param("personId") int personId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询学员完成课后练习情况
     * @param personId 学员id
     * @param startTime 开始时间
     * @param endTime 结束日期
     * @return
     */
    StudentReportCustomize selectPracticeQuestionByPersonId(@Param("personId") int personId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询学习建议类容
     * @param gradeId 学习建议年级分类
     * @param knowledgeId 知识点分类id
     * @return
     */
    List<Map<String,Object>> selectStudySuggestionsContentByKnowledgeId(@Param("gradeId")int gradeId,@Param("knowledgeId") List<Integer> knowledgeId);

    /**
     * 查询阶段检测反馈表信息
     * @param id 反馈表id
     * @return 阶段检测反馈表信息
     */
    StudentReportCustomizeDetail selectStageFeedbackInfoById(Integer id);
}
